#ifndef __MSG_CONVERT_H__
#define __MSG_CONVERT_H__

#include <iostream>
#include <fstream>
#include <tuple>
#include <jsoncpp/json/json.h>
#include <tasks_manager/base_define.h>

using namespace std;

class MsgConvert{
    public:
        MsgConvert(){};
        ~MsgConvert(){};

        /*******************************************
         * msg_convert_common
         * 时间戳转换 
         *******************************************/
        // 时间戳转标准字符串格式
        string TimestampFormat(long timestamp);
        // 时间字符串转时间戳
        std::time_t TimeStr2Timestamp(string time_str);
        // 获取时区
        std::string GetTimezone();

        /*******************************************
         * msg_convert_common
         * ROS默认消息数据转换
         *******************************************/
        // Euler(roll, pitch, yaw) -> tf2::Quaternion
        tf2::Quaternion Euler2TFQuaternion(double roll, double pitch, double yaw);
        // tf2::Quaternion -> Euler(roll, pitch, yaw)
        std::tuple<double, double, double> TFQuaternion2Euler(tf2::Quaternion tf2_quat);
        // Euler(roll, pitch, yaw) -> geometry_msgs::Quaternion
        geometry_msgs::Quaternion Euler2GeometryQuaternion(double roll, double pitch, double yaw);
        // geometry_msgs::Quaternion -> Euler(roll, pitch, yaw)
        std::tuple<double, double, double> GeometryQuaternion2Euler(geometry_msgs::Quaternion geom_quat);
        // geometry_msgs::Pose -> geometry_msgs::Point
        geometry_msgs::Point Pose2Point(geometry_msgs::Pose pose);
        // vector<geometry_msgs::Pose> -> vector<geometry_msgs::Point>
        vector<geometry_msgs::Point> Poses2Points(vector<geometry_msgs::Pose> poses);

       /*******************************************
        * msg_convert_common
        * 转换成字符串
        *******************************************/
        // Bool -> string
        string Bool2Str(bool data);
        // string -> bool
        bool Str2Bool(string data);
        // 特殊字符转义
        std::string EscapeString(const std::string& input);

        /*******************************************
         * msg_convert_common
         * JSON 消息数据转换
         *******************************************/
        // 检测Json字段是否有效
        bool CheckJsonItemIsValid(Json::Value& json_data, string item);
        // 消息转换 Json::Value -> std::string
        string JsonValue2String(Json::Value json_data);
        // 消息转换 std::string -> Json::Value
        Json::Value String2JsonValue(string str_data);
        // geometry_msgs::Point -> Json::Value
        Json::Value Point2Json(geometry_msgs::Point& point);
        // Json::Value -> geometry_msgs::Point
        geometry_msgs::Point Json2Point(Json::Value& json_data);
        // geometry_msgs::Quaternion -> Json::Value
        Json::Value Quaternion2Json(geometry_msgs::Quaternion& q);
        // Json::Value -> geometry_msgs::Quaternion
        geometry_msgs::Quaternion Json2Quaternion(Json::Value& json_data);
        // geometry_msgs::Pose -> Json::Value
        Json::Value Pose2Json(geometry_msgs::Pose& pose);
        // Json::Value -> geometry_msgs::Pose
        geometry_msgs::Pose Json2Pose(Json::Value& json_data);
        // ros::Time -> Json::Value
        Json::Value RosTime2Json(ros::Time& time);
        // Json::Value -> ros::Time
        ros::Time Json2RosTime(Json::Value& json_data);
        // nav_msgs::MapMetaData -> Json::Value
        Json::Value MapMetaData2Json(nav_msgs::MapMetaData& metadata);
        // Json::Value -> nav_msgs::MapMetaData
        nav_msgs::MapMetaData Json2MapMetaData(Json::Value& json_data);
        // std_msgs::Header -> Json::Value
        Json::Value Header2Json(std_msgs::Header& header);
        // Json::Value -> std_msgs::Header
        std_msgs::Header Json2Header(Json::Value& json_data);
        // geometry_msgs::PoseStamped -> Json::Value
        Json::Value PoseStamped2Json(geometry_msgs::PoseStamped& pose_stamp);
        // Json::Value -> geometry_msgs::PoseStamped
        geometry_msgs::PoseStamped Json2PoseStamped(Json::Value& json_data);
        // nav_msgs::Path -> Json::Value
        Json::Value Path2Json(nav_msgs::Path& path);
        // Json::Value -> nav_msgs::Path
        nav_msgs::Path Json2Path(Json::Value& json_data);
        // vector<geometry_msgs::Pose> -> Json::Value
        Json::Value Poses2Json(vector<geometry_msgs::Pose>& poses);
        // Json::Value -> vector<geometry_msgs::Pose>
        vector<geometry_msgs::Pose> Json2Poses(Json::Value& json_data);
        // vector<int> -> Json::Value
        Json::Value IntVector2Json(vector<int>& int_data);
        // Json::Value -> vector<int>
        vector<int> Json2IntVector(Json::Value& json_data);
        // 定时任务转字符串 TimerTask -> string
        string TimerTask2Str(TimerTask timer_task);

        /*******************************************
         * msg_convert
         * v3_msgs 消息数据转换
         *******************************************/
        // TaskType -> v3_msgs::TaskType
        v3_msgs::TaskType TaskType2V3Msgs(TaskType task_type);
        // v3_msgs::TaskType -> TaskType
        TaskType V3Msgs2TaskType(v3_msgs::TaskType task_type_v3);
        // TaskState -> v3_msgs::TaskState
        v3_msgs::TaskState TaskStatus2V3Msgs(TaskState task_status);
        // v3_msgs::TaskState -> TaskState
        TaskState V3Msgs2TaskStatus(v3_msgs::TaskState task_status_v3);
        // EdgeMode -> v3_msgs::EdgeMode
        v3_msgs::EdgeMode EdgeMode2V3Msgs(EdgeMode edge_mode);
        // v3_msgs::EdgeMode -> EdgeMode
        EdgeMode V3Msgs2EdgeMode(v3_msgs::EdgeMode edge_mode_v3);
        // TaskControlMode -> v3_msgs::TaskControlMode
        v3_msgs::TaskControlMode TaskControlMode2V3Msgs(TaskControlMode task_control_mode);
        // v3_msgs::TaskControlMode -> TaskControlMode
        TaskControlMode V3Msgs2TaskControlMode(v3_msgs::TaskControlMode task_control_mode_v3);
        // TaskSpeed -> v3_msgs::TaskSpeed
        v3_msgs::TaskSpeed TaskSpeed2V3Msgs(TaskSpeed task_speed);
        // v3_msgs::TaskSpeed -> TaskSpeed
        TaskSpeed V3Msgs2TaskSpeed(v3_msgs::TaskSpeed task_speed_v3);
        // PathGenerateType -> v3_msgs::PathGenerateType
        v3_msgs::PathGenerateType PathGenerateType2V3Msgs(PathGenerateType path_generate_type);
        // v3_msgs::PathGenerateType -> PathGenerateType
        PathGenerateType V3Msgs2PathGenerateType(v3_msgs::PathGenerateType path_generate_type_v3); 
        // PathGenerateAction -> v3_msgs::PathGenerateAction
        v3_msgs::PathGenerateAction PathGenerateAction2V3Msgs(PathGenerateAction path_generate_action);
        // v3_msgs::PathGenerateAction -> PathGenerateAction
        PathGenerateAction V3Msgs2PathGenerateAction(v3_msgs::PathGenerateAction path_generate_action_v3);
        // DeviceType -> v3_msgs::DeviceType
        v3_msgs::DeviceType DeviceType2V3Msgs(DeviceType device_type);
        // v3_msgs::DeviceType -> DeviceType
        DeviceType V3Msgs2DeviceType(v3_msgs::DeviceType device_type_v3);
        // TaskPath -> v3_msgs::TaskPath
        v3_msgs::TaskPath TaskPath2V3Msgs(TaskPath task_path);
        // v3_msgs::TaskPath -> TaskPath
        TaskPath V3Msgs2TaskPath(v3_msgs::TaskPath task_path_v3);
        // TaskBase -> v3_msgs::TaskBase
        v3_msgs::TaskBase TaskBase2V3Msgs(TaskBase task_base);
        // v3_msgs::TaskBase -> TaskBase
        TaskBase V3Msgs2TaskBase(v3_msgs::TaskBase task_base_v3);
        // TaskEcho -> v3_msgs::TaskEcho
        v3_msgs::TaskEcho TaskEcho2V3Msgs(TaskEcho task_echo);
        // v3_msgs::TaskEcho -> TaskEcho
        TaskEcho V3Msgs2TaskEcho(v3_msgs::TaskEcho task_echo_v3);
        // TaskSingle -> v3_msgs::TaskSingle
        v3_msgs::TaskSingle TaskSingle2V3Msgs(TaskSingle task_single);
        // v3_msgs::TaskSingle -> TaskSingle
        TaskSingle V3Msgs2TaskSingle(v3_msgs::TaskSingle task_single_v3);
        // TaskGroup -> v3_msgs::TaskGroup
        v3_msgs::TaskGroup TaskGroup2V3Msgs(TaskGroup task_group);
        // v3_msgs::TaskGroup -> TaskGroup
        TaskGroup V3Msgs2TaskGroup(v3_msgs::TaskGroup task_group_v3);
        // TimerTask -> v3_msgs::TimerTask
        v3_msgs::TimerTask TimerTask2V3Msgs(TimerTask timer_task);
        // v3_msgs::TimerTask -> TimerTask
        TimerTask V3Msgs2TimerTask(v3_msgs::TimerTask timer_task_v3);
        // OnlineTask -> v3_msgs::OnlineTask
        v3_msgs::OnlineTask OnlineTask2V3Msgs(OnlineTask online_task);
        // v3_msgs::OnlineTask -> OnlineTask
        OnlineTask V3Msgs2OnlineTask(v3_msgs::OnlineTask online_task_v3);
        // TaskPicture -> v3_msgs::TaskPicture
        v3_msgs::TaskPicture TaskPicture2V3Msgs(TaskPicture task_picture);
        // v3_msgs::TaskPicture -> TaskPicture
        TaskPicture V3Msgs2TaskPicture(v3_msgs::TaskPicture task_picture_v3);
        // TaskRecord -> v3_msgs::TaskRecord
        v3_msgs::TaskRecord TaskRecord2V3Msgs(TaskRecord task_record);
        // v3_msgs::TaskRecord -> TaskRecord
        TaskRecord V3Msgs2TaskRecord(v3_msgs::TaskRecord task_record_v3);
        // v3_msgs::PathGenerate -> PathGenerate
        PathGenerate V3Msgs2PathGenerate(v3_msgs::PathGenerate& path_gen_msg);
        // PathGenerate -> v3_msgs::PathGenerate
        v3_msgs::PathGenerate PathGenerate2V3Msgs(const PathGenerate& path_gen);

        /*******************************************
        * msg_convert
        * 转换成字符串
        *******************************************/
        // TaskType -> string
        string TaskType2Str(TaskType task_type);
        // string -> TaskType
        TaskType Str2TaskType(string task_type);
        // TaskState -> string
        string TaskState2Str(TaskState task_state);
        // string -> TaskState
        TaskState Str2TaskState(string task_state);
        // EdgeMode -> string
        string EdgeMode2Str(EdgeMode edge_mode);
        // string -> EdgeMode
        EdgeMode Str2EdgeMode(string edge_mode);
        // TaskControlMode -> string
        string TaskControlMode2Str(TaskControlMode task_control_mode);
        // string -> TaskControlMode
        TaskControlMode Str2TaskControlMode(string task_control_mode);
        // TaskSpeed -> string
        string TaskSpeed2Str(TaskSpeed task_speed);
        // string -> TaskSpeed
        TaskSpeed Str2TaskSpeed(string task_speed);
        // PathGenerateType -> string
        string PathGenerateType2Str(PathGenerateType path_generate_type);
        // string -> PathGenerateType
        PathGenerateType Str2PathGenerateType(string path_generate_type);
        // PathGenerateAction -> string
        string PathGenerateAction2Str(PathGenerateAction path_generate_action);
        // string -> PathGenerateAction
        PathGenerateAction Str2PathGenerateAction(string path_generate_action);
        // DeviceType -> string
        string DeviceType2Str(DeviceType device_type);
        // string -> DeviceType
        DeviceType Str2DeviceType(string device_type);

        /*******************************************
         * msg_convert
         * JSON 消息数据转换
         *******************************************/ 
        // v3_msgs::Building -> Json::Value
        Json::Value Building2Json(v3_msgs::Building& building);
        // Json::Value -> v3_msgs::Building
        v3_msgs::Building Json2Building(Json::Value& json_data);
        // v3_msgs::Floor -> Json::Value
        Json::Value Floor2Json(v3_msgs::Floor& floor);
        // Json::Value -> v3_msgs::Floor
        v3_msgs::Floor Json2Floor(Json::Value& json_data);
        // v3_msgs::MapBase -> Json
        Json::Value MapBase2Json(v3_msgs::MapBase& map_base);
        // Json::Value -> v3_msgs::MapBase
        v3_msgs::MapBase Json2MapBase(Json::Value& json_data);
        // TaskType -> Json::Value
        // Json::Value TaskType2Json(TaskType task_type);
        // Json::Value -> TaskType
        TaskType Json2TaskType(Json::Value& json_data);
        // DeviceType -> Json::Value
        // Json::Value DeviceType2Json(DeviceType device_type);
        // Json::Value -> DeviceType
        DeviceType Json2DeviceType(Json::Value& json_data);
        // TaskControlMode -> Json::Value
        // Json::Value TaskControlMode2Json(TaskControlMode task_control_mode);
        // Json::Value -> TaskControlMode
        TaskControlMode Json2TaskControlMode(Json::Value& json_data);
        // EdgeMode -> Json::Value
        // Json::Value EdgeMode2Json(EdgeMode edge_mode);
        // Json::Value -> EdgeMode
        EdgeMode Json2EdgeMode(Json::Value& json_data);
        // TaskSpeed -> Json::Value
        // Json::Value TaskSpeed2Json(TaskSpeed task_speed);
        // Json::Value -> TaskSpeed
        TaskSpeed Json2TaskSpeed(Json::Value& json_data);
        // TaskPath -> Json::Value
        Json::Value TaskPath2Json(TaskPath& task_path);
        // Json::Value -> TaskPath
        TaskPath Json2TaskPath(Json::Value& json_data);
        // v3_msgs::PolygonData -> Json::Value
        Json::Value PolygonData2Json(v3_msgs::PolygonData& polygon);
        // Json::Value -> v3_msgs::PolygonData
        v3_msgs::PolygonData Json2PolygonData(Json::Value& json_data);
        //  PathGenerate -> Json::Value
        Json::Value PathGenerate2Json(PathGenerate& path_generate);
        // Json::Value -> PathGenerate
        PathGenerate Json2PathGenerate(Json::Value& json_data);
        // TaskBase -> Json::Value
        Json::Value TaskBase2Json(TaskBase& task_base);
        // Json::Value -> TaskBase
        TaskBase Json2TaskBase(Json::Value& json_data);
        // v3_msgs::ErrorCode -> Json::Value
        Json::Value ErrorCode2Json(v3_msgs::ErrorCode& error_code);
        // Json::Value -> v3_msgs::ErrorCode
        v3_msgs::ErrorCode Json2ErrorCode(Json::Value& json_data);
        // TaskPicture -> Json::Value
        Json::Value TaskPicture2Json(TaskPicture& task_picture);
        // Json::Value -> TaskPicture
        TaskPicture Json2TaskPicture(Json::Value& json_data);
        // TaskEcho -> Json::Value
        Json::Value TaskEcho2Json(TaskEcho& task_echo);
        // Json::Value -> TaskEcho
        TaskEcho Json2TaskEcho(Json::Value& json_data);
        // TaskSingle -> Json::Value
        Json::Value TaskSingle2Json(TaskSingle& task_single);
        // Json::Value -> TaskSingle
        TaskSingle Json2TaskSingle(Json::Value& json_data);
        // TaskGroup -> Json::Value
        Json::Value TaskGroup2Json(TaskGroup& task_group);
        // Json::Value -> TaskGroup
        TaskGroup Json2TaskGroup(Json::Value& json_data);
        // TimerTask -> Json::Value
        Json::Value TimerTask2Json(TimerTask& timer_task);
        // Json::Value -> TimerTask
        TimerTask Json2TimerTask(Json::Value& json_data);
        // TaskRecord -> Json::Value
        Json::Value TaskRecord2Json(TaskRecord& task_record);
        // Json::Value -> TaskRecord
        TaskRecord Json2TaskRecord(Json::Value& json_data);

        /*******************************************
        * msg_convert
        * 消息兼容转换
        *******************************************/
       // v3_msgs::PolygonData -> geometry_msgs::Polygon
        geometry_msgs::Polygon PolygonData2PolygonMsg(v3_msgs::PolygonData& polygon);
        // geometry_msgs::Polygon -> v3_msgs::PolygonData
        v3_msgs::PolygonData PolygonMsg2PolygonData(geometry_msgs::Polygon& polygon);
        // TaskBase -> cln_msgs::CleanTask
        cln_msgs::CleanTask TaskBase2CleanTask(TaskBase& task_base);
        // cln_msgs::CleanTask -> TaskBase
        TaskBase CleanTask2TaskBase(cln_msgs::CleanTask& clean_task);
        // cln_msgs::CleanTask -> TaskGenerate
        TaskSingle CleanTask2TaskSingle(cln_msgs::CleanTask& clean_task);
        // cln_msgs::TaskMeta -> TaskPath
        TaskPath TaskMeta2TaskPath(cln_msgs::TaskMeta& task_meta);

};




#endif
